#include "server.h"

int pipe_fd[2];

void func(int num){
    write(pipe_fd[1], "1", 1);
}
int main(){

    pipe(pipe_fd);

    if(fork() != 0){
        // 父进程
        signal(2, func);

        wait(NULL);
        printf("子进程退出, 所有都退出 \n");
        exit(0);
    }
    setpgid(0, 0);

    // 读取配置文件
    config_info info;
    init_config(&info);
    load_config(&info);

    // 初始化socket
    ServerInfo server;
    init_server(&server, info);  


    // epoll
    int epoll_fd = epoll_create(1);
    add_epoll(epoll_fd, server.server_socket);

    // 监听管道读端
    add_epoll(epoll_fd, pipe_fd[0]);
    while(1){

        struct epoll_event list[10];
        int epoll_num = epoll_wait(epoll_fd, list, 10, -1);

        for(int i=0; i<epoll_num; i++){
            int fd = list[i].data.fd;

            if(fd == server.server_socket){
                // 说明有新链接进来 -> 放入队列
                int net_fd = accept(server.server_socket, NULL, NULL);

                pthread_mutex_lock(&server.clients_mutex);
                server.client_count++;// 记录当前连接数
                enQueue(&server.queue, net_fd);
                pthread_cond_broadcast(&server.cond );
                pthread_mutex_unlock(&server.clients_mutex);
            }else if(fd == pipe_fd[0]){
                // 要求退出
                char buf[10] = {0};
                read(pipe_fd[0], buf, sizeof(buf));

                // 通知子线程退出
                pthread_mutex_lock(&server.clients_mutex);
                server.exit_flag = 1;

                pthread_cond_broadcast(&server.cond );
                pthread_mutex_unlock(&server.clients_mutex);

                // 等待子线程退出
                for(int k=0; k<4; k++){
                    pthread_join(server.thread_ids[k], NULL);
                }
                printf("所有子线程退出, 自己也退出\n");
                pthread_exit(NULL);
            }
        }

    }
    return 0;
}

